package Day_0216.JVM.GarbageCollection;

/**
 * @author zxc
 * @date 2023/02/16 11:50
 **/
public class Generation_Collection_Algorithm {
    public static void main(String[] args) {
        /**
         * 具体谈一谈对于分代回收算法的理解
         * ===》
         * 1.分代收集法，是目前大部分 JVM 所采用的方法，
         * （1）其核心思想是，根据对象存活的不同生命周期，将内存划分为不同的域;
         * （2）一般情况下，将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(YoungGeneration)。
         * （3）老生代的特点是每次垃圾回收时，只有少量对象需要被回收;
         * （4）新生代的特点是每次垃圾回收时，都有大量垃圾对象需要被回收;
         * ===》因此可以根据不同区域选择不同的算法。
         *
         * 2.当前主流 VM 垃圾收集都采用”分代收集” (Generational Collection)算法,
         * 这种算法会根据对象存活生命周期的不同，将内存划分为几块,
         * 如 JVM 中的 新生代、老年代、永久代， 可以根据各年代特点，分别采用最适当的 GC 算法
         *
         * 3.新生代与复制算法
         * （1）在新生代，每次垃圾收集都能发现大批对象已死, 只有少量对象存活.
         *  因此选用复制算法, 只需要付出少量存活对象的复制成本，就可以完成收集
         * （2）目前大部分 JVM 的 GC 对于新生代，都采取 Copying 算法，因为新生代中每次垃圾回收都要回收大部分对象，
         *  即，要复制的操作比较少，但通常并不是按照 1： 1 来划分新生代。
         * （3）一般将新生代划分为一块较大的Eden 空间和两个较小的 Survivor 空间(From Space, To Space)，
         *  每次使用Eden 空间和其中的一块Survivor 空间，
         *  当进行回收时，将该两块空间中还存活的对象复制到另一块 Survivor 空间中。
         *
         * 4.老年代与标记-清除/整理算法
         * 因为老年代对象存活率高、没有额外空间对它进行分配担保;
         * 就必须采用“标记—清理”或“标记—整理” 算法来进行回收,不必进行内存复制, 且直接腾出空闲内存。
         * 因而采用 Mark-Compact 算法。
         *
         * （1）JAVA 虚拟机提到过的处于方法区的永生代(Permanet Generation)
         *  它用来存储 class 类，常量，方法描述等。
         *  ===》对永久代的回收，主要包括废弃常量和无用的类。
         * （2）对象的内存分配，主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor 目前存放对象的那一块)，
         *  少数情况会直接分配到老生代;
         * （3） 当新生代的 Eden Space 和 From Space 空间不足时就会发生一次 GC，
         *  进行 GC 后， EdenSpace和 From Space 区的存活对象会被挪到 To Space，
         *  然后将 Eden Space 和 FromSpace 进行清理。
         *
         * （4） 如果 To Space 无法足够存储某个对象（大对象的特殊情况），则将这个对象存储到老生代;
         * （5）在进行 GC 后，使用的便是 Eden Space 和 To Space 了，如此反复循环;
         * （6）当对象在 Survivor 区躲过一次 GC 后，其年龄就会+1。 默认情况下年龄到达 15 的对象会被移到老生代中;
         *
         */
    }
}
